from PIL import Image
import requests
import base64
import json

# 保持宽高比缩放
def resize_and_pad_image(image_path, output_size=(214, 214), fill_color=(255, 255, 255, 0)):
    """
    将图片等比例缩放，并用指定颜色填充以达到目标尺寸。
    
    :param image_path: 输入图片的路径。
    :param output_size: 输出图片的目标尺寸，默认为 (214, 214)。
    :param fill_color: 填充区域的颜色，默认为透明（对于RGBA图像）。
    :return: 处理后的Image对象。
    """
    # 打开图片并转换为RGBA模式
    img = Image.open(image_path).convert("RGBA")
    
    # 等比例缩放
    img.thumbnail(output_size, Image.Resampling.LANCZOS)
    
    # 创建输出尺寸的新图像（使用fill_color填充）
    new_img = Image.new("RGBA", output_size, fill_color)
    
    # 计算粘贴位置
    paste_x = (output_size[0] - img.width) // 2
    paste_y = (output_size[1] - img.height) // 2
    
    # 将缩放后的图片粘贴到新图像中
    new_img.paste(img, (paste_x, paste_y), img)
    
    return new_img

# 通过 webhook 获取小程序页面路径，后期有新路径时，需要更新这个方法
def get_page(webhook):
    page = "pages/index/index"
    match webhook:
        case "news_create":
            page = "pages/news/view"
        case "album_create":
            page = "custom/album/view"
        case "audio_create":
            page = "custom/yinpin/view"
        case "video_create":
            page = "custom/shipin/view"
        case "restart":
            page = "pages/index/index"
        case _:  # 相当于 default
            print(f"未适配 webhook：{webhook}") 
    return page

# 生成小程序码 文档：https://docs.diycms.com/webhook/wxacode_create_bytes/
# # 使用示例
# success, msg = wxacode_create_bytes(
#     service_token="Bearer xxxxxxx",
#     webhook="audio_create",
#     data_id="65e7bfe56631e53c383c0df9",
#     save_path="qrcode.png"
# )

# if success:
#     print("✅ 成功:", msg)
# else:
#     print("❌ 失败:", msg)
    
def wxacode_create_bytes(service_token, webhook, data_id, save_path):
    """
    调用微信小程序码生成接口，将二维码图片保存到本地
    
    :param service_token: str, 授权 token
    :param webhook: str, webhook 标识
    :param data_id: str, 数据 ID（如文章 ID）
    :param save_path: str, 本地保存路径，如 'qrcode.png'
    :return: tuple(success: bool, message: str) 成功或失败及原因
    """
    headers = {
        'Content-Type': 'application/json',
        'Authorization': service_token,
    }

    log = json.dumps({
        'webhook': webhook,
        'data_id': data_id
    })

    page = get_page(webhook)
    data = {
        'data': {
            "page": page,#// String 页面路径，例如 pages/news/view，根路径前不要填加 /，不能携带参数
            "scene": data_id,#// String 按页面路径，输入对应的ID 如文章ID：65e1de197825322b03e44f5c
            "check_path": True,#// String 检查page 是否存在
            "env_version": "release",#// String 正式版为 "release"，体验版为 "trial"
            "width": 430,#// Integer 二维码的宽度，单位 px
            "auto_color": False,#// String 自动配置线条颜色
            "line_color": {"r":0,"g":0,"b":0},#// String 使用 rgb 设置颜色 例如：{"r":0,"g":0,"b":0}
            "is_hyaline": False #// String 是否需要透明底色
        },
        'env': 'prod',
        'logs': {
            'type': 'json',
            'log': log
        },
    }
    
    try:
        response = requests.post(
            url='https://openapi.diycms.com/webhook/wxacode/create_bytes',
            headers=headers,
            json=data,
            timeout=20
        )
        
        result = response.json()
        
        if result.get('code') != 'ok':
            return False, f"请求未成功: {result.get('message', '未知错误')}"

        img_data_base64 = result['payload'].get('imgdata')
        if not img_data_base64:
            return False, "响应中没有 imgdata"
        
        # 移除可能存在的 data URL scheme
        if img_data_base64.startswith('data:image/png;base64,'):
            img_data_base64 = img_data_base64[len('data:image/png;base64,'):]
        if img_data_base64.startswith('data:image/jpeg;base64,'):
            img_data_base64 = img_data_base64[len('data:image/jpeg;base64,'):]

        # 解码 base64 并保存文件
        with open(save_path, 'wb') as f:
            f.write(base64.b64decode(img_data_base64))
            
        return True, f"小程序码已保存至: {save_path}"
        
    except Exception as e:
        return False, f"发生异常: {str(e)}"

# # 使用示例
# image_url = "https://example.com/image.jpg"
# save_location = "downloaded_image.jpg"
# success = download_image(image_url, save_location)
# if not success:
#     print("下载图片失败，请检查网络或URL地址。")

def download_image(url, save_path):
    """
    下载图片并保存到指定路径

    :param url: 图片的 URL 地址
    :param save_path: 本地保存路径，例如: 'image.jpg'
    """
    try:
        # 发送 GET 请求，设置流式下载（节省内存）
        response = requests.get(url, stream=True, timeout=10)
        response.raise_for_status()  # 如果状态码不是 2xx，抛出 HTTPError

        # 检查是否为图像内容类型
        content_type = response.headers.get('content-type')
        if 'image' not in content_type:
            print("⚠️ 警告: 获取的内容可能不是图片")
            return False

        # 将内容写入文件
        with open(save_path, 'wb') as file:
            for chunk in response.iter_content(chunk_size=8192):  # 分块下载
                if chunk:  # 过滤掉保持活动连接的空字节
                    file.write(chunk)
        print(f"✅ 图片已成功下载并保存至: {save_path}")
        return True

    except requests.exceptions.HTTPError as e:
        print(f"❌ HTTP 错误: {e}")
    except requests.exceptions.ConnectionError as e:
        print(f"❌ 连接错误: {e}")
    except requests.exceptions.Timeout as e:
        print(f"❌ 超时错误: {e}")
    except requests.exceptions.RequestException as e:
        print(f"❌ 请求错误: {e}")
    except IOError as e:
        print(f"❌ 文件IO错误: {e}")
    return False
